package com.itheima.grow.service.impl;

import cn.hutool.core.date.DateTime;
import com.aliyun.oss.OSS;
import com.aliyun.oss.OSSClientBuilder;
import com.itheima.grow.model.info.OssFileInfo;
import com.itheima.grow.service.OssService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Service;
import org.springframework.web.multipart.MultipartFile;
import java.io.ByteArrayInputStream;
import java.io.InputStream;
import java.util.UUID;

@Service
@Slf4j
public class OssServiceImpl implements OssService {

    /**
     * 对应公网endpoint地址
     */
    @Value("${aliyun.oss.file.endpoint}")
    private String endpoint;
    /**
     * 账号
     */
    @Value("${aliyun.oss.file.keyid}")
    private String keyId;
    /**
     * 密码
     */
    @Value("${aliyun.oss.file.keysecret}")
    private String keySecret;
    /**
     * 对应要存储到哪个块
     */
    @Value("${aliyun.oss.file.bucketname}")
    private String bucketName;

    @Override
    public OssFileInfo uploadFile(MultipartFile file) {
        OssFileInfo ossFileInfo = new OssFileInfo();
        try {
            // 创建OSSClient实例。
            OSS ossClient = new OSSClientBuilder().build(endpoint, keyId, keySecret);
            // 填写本地文件的完整路径。如果未指定本地路径，则默认从示例程序所属项目对应本地路径中上传文件流。
            InputStream inputStream = file.getInputStream();
            //获取文件真实名称
            String originalFilename = file.getOriginalFilename();
            ossFileInfo.setFileName(originalFilename);
            //重命名，防止相同文件出现覆盖 生成的f4f2e1a3-391a-4d5a-9438-0c9f5d27708=》需要替换成f4f2e1a3391a4d5a94380c9f5d27708c
            String uuid = UUID.randomUUID().toString().replaceAll("-","");
            //新的文件名
            originalFilename=uuid+originalFilename;
            //2、把文件按照日期进行分类
            // 2021/6/30
            String datePath = new DateTime().toString("yyyy-MM-dd");
            //拼接 021/6/30/1.jpg
            originalFilename=datePath+"/"+originalFilename;
            // oss实现上传文件
            //第一个参数：Bucket名称
            //第二个参数：上传到oss文件路径和文件名称 /zhz/avatar.txt
            ossClient.putObject(bucketName, originalFilename, inputStream);
            // 关闭OSSClient。
            ossClient.shutdown();

            //把上传之后文件路径返回
            //需要把上传到阿里云oss路径手动拼接出来->https://zhz-mail.oss-cn-beijing.aliyuncs.com/WechatIMG19.jpeg
            String url="https://"+bucketName+"."+endpoint+"/"+originalFilename;
            ossFileInfo.setUrl(url);
            return ossFileInfo;
        } catch (Exception e) {
            throw new RuntimeException("文件上传阿里云失败！");
        }
    }

    @Override
    public OssFileInfo uploadFile(byte[] bytes) {
        InputStream inputStream = new ByteArrayInputStream(bytes);
        OssFileInfo ossFileInfo = new OssFileInfo();
        try {
            // 创建OSSClient实例。
            OSS ossClient = new OSSClientBuilder().build(endpoint, keyId, keySecret);
            // 填写本地文件的完整路径。如果未指定本地路径，则默认从示例程序所属项目对应本地路径中上传文件流。
            //获取文件真实名称
            String originalFilename = "easy.pdf";
            ossFileInfo.setFileName(originalFilename);
            //重命名，防止相同文件出现覆盖 生成的f4f2e1a3-391a-4d5a-9438-0c9f5d27708=》需要替换成f4f2e1a3391a4d5a94380c9f5d27708c
            String uuid = UUID.randomUUID().toString().replaceAll("-","");
            //新的文件名
            originalFilename=uuid+originalFilename;
            //2、把文件按照日期进行分类
            // 2021/6/30
            String datePath = new DateTime().toString("yyyy-MM-dd");
            //拼接 021/6/30/1.jpg
            originalFilename=datePath+"/"+originalFilename;
            // oss实现上传文件
            //第一个参数：Bucket名称
            //第二个参数：上传到oss文件路径和文件名称 /zhz/avatar.txt
            ossClient.putObject(bucketName, originalFilename, inputStream);
            // 关闭OSSClient。
            ossClient.shutdown();

            //把上传之后文件路径返回
            //需要把上传到阿里云oss路径手动拼接出来->https://zhz-mail.oss-cn-beijing.aliyuncs.com/WechatIMG19.jpeg
            String url="https://"+bucketName+"."+endpoint+"/"+originalFilename;
            ossFileInfo.setUrl(url);
            return ossFileInfo;
        } catch (Exception e) {
            throw new RuntimeException("文件上传阿里云失败！");
        }
    }
}
